 
function wxPromisify(fn) {
  return function (obj = {}) {
    return new Promise((resolve, reject) => {
      obj.success = function (res) {
        //成功
        resolve(res);
      };

      obj.fail = function (res) {
        //失败
        reject(res);
      };

      fn(obj);
    });
  };
} //无论promise对象最后状态如何都会执行


Promise.prototype.finally = function (callback) {
  let P = this.constructor;
  return this.then(value => P.resolve(callback()).then(() => value), reason => P.resolve(callback()).then(() => {
    throw reason;
  }));
};
/**
 * 微信用户登录,获取code
 */


function wxLogin() {
  // 仅在微信小程序或已注入 wx 对象的环境中可用
  try {
    if (typeof wx !== 'undefined' && wx && typeof wx.login === 'function') {
      return wxPromisify(wx.login);
    }
  } catch (e) {}
  // 其他平台返回拒绝，避免 ReferenceError
  return Promise.reject(new Error('wx.login 不可用：当前非微信小程序或未注入 wx 对象'));
}
/**
 * 获取微信用户信息
 * 注意:须在登录之后调用
 */


function wxGetUserInfo() {
  // 仅在微信小程序或已注入 wx 对象的环境中可用
  try {
    if (typeof wx !== 'undefined' && wx && typeof wx.getUserInfo === 'function') {
      return wxPromisify(wx.getUserInfo);
    }
  } catch (e) {}
  // 其他平台返回拒绝，避免 ReferenceError
  return Promise.reject(new Error('wx.getUserInfo 不可用：当前非微信小程序或未注入 wx 对象'));
}
/**
 * 获取系统信息
 */


function wxGetSystemInfo() {
  // 优先使用跨平台 API，避免非小程序环境下 wx 未定义
  try {
    if (typeof uni !== 'undefined' && typeof uni.getSystemInfo === 'function') {
      return wxPromisify(uni.getSystemInfo);
    }
  } catch (e) {}
  // 退回到小程序 API（仅当 wx 可用时）
  try {
    if (typeof wx !== 'undefined' && wx && typeof wx.getSystemInfo === 'function') {
      return wxPromisify(wx.getSystemInfo);
    }
  } catch (e2) {}
  // 若均不可用，返回拒绝
  return Promise.reject(new Error('无法获取系统信息：未找到可用的 API'));
}
/**
 * 保留当前页面，跳转到应用内的某个页面
 * url:'../index/index'
 * params:{key:value1}
 */


function wxNavigateTo(url, params) {
  var wxNavigateTo = wxPromisify(uni.navigateTo);
  const serializedParams = this.paramSerializer(params);

  if (serializedParams.length > 0) {
    url += (url.indexOf('?') == -1 ? '?' : '&') + serializedParams;
  }

  return wxNavigateTo({
    url: url
  });
}

module.exports = {
  wxPromisify: wxPromisify,
  wxLogin: wxLogin,
  wxGetUserInfo: wxGetUserInfo,
  wxGetSystemInfo: wxGetSystemInfo
};